package com.yizisu.playerlibrary.helper

import android.media.AudioManager
import com.yizisu.playerlibrary.IYzsPlayer
import com.yizisu.playerlibrary.impl.exoplayer.PlayerPlayWhenReady
import com.yizisu.playerlibrary.impl.exoplayer.PlayerPlaybackState
import kotlinx.coroutines.CoroutineScope

interface SimplePlayerListener<Model : PlayerModel> : AudioManager.OnAudioFocusChangeListener {
    /**
     * 每秒钟回调一次
     */
    @Deprecated("请使用同名的挂起函数", replaceWith = ReplaceWith("suspend fun onTick"))
    fun onTick(playerModel: Model) {

    }

    /**
     * 每秒钟回调一次
     */
    suspend fun onTick(playerModel: Model, scope: CoroutineScope) {

    }

    /**
     * 当视频发生错误
     */
    fun onError(throwable: Throwable, playerModel: Model?) {}

    /**
     * 开始准备资源
     */
    fun onPrepare(playerModel: Model?) {}

    /**
     * 资源准备完成，已经创建了mediaItem，准备开始加载资源
     */
    fun onPrepareComplete(model: Model) {}

    /**
     * 点击下一首
     */
    fun onNext(playerModel: Model?) {}

    /**
     * 点击上一首
     */
    fun onPrevious(playerModel: Model?) {}

    /**
     * 当视频播放
     */
    fun onPlay(playStatus: Boolean, playerModel: Model?) {}

    /**
     * 可能由于
     * 1.缓存暂停
     * 2.手动暂停
     * playStatus：当前播放状态 true 播放 false 暂停
     */
    fun onPause(playStatus: Boolean, playerModel: Model?) {}

    /**
     * 停止播放
     * 播放器调用停止播放的时候回调
     */
    fun onStop(playStatus: Boolean, playerModel: Model?) {}


    /**
     * 当缓存状态发生变化
     */
    fun onBufferStateChange(isBuffering: Boolean, playStatus: Boolean, playerModel: Model?) {}

    /**
     * playWhenReady发生变化的时候调用
     */
    fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: PlayerPlayWhenReady) {}

    /**
     * 播放状态发生变化的时候调用
     */
    fun onPlaybackStateChanged(state: PlayerPlaybackState) {}

    /**
     * 当播放发生变化，有可能上一次和这一次的model是同一个对象
     */
    fun onPlayerModelChange(playerModel: Model) {}

    /**
     * 当播放发生变化,并且上一次和这次的model不一样
     */
    fun onPlayerModelChange(lastModel: Model?, playerModel: Model) {}

    /**
     * 当播放列表发生变化
     */
    fun onPlayerListChange(playerModels: List<Model>) {}

    /**
     * 当渲染第一帧
     */
    fun onRenderedFirstFrame(playerModel: Model?) {

    }

    /**
     * 获取视频尺寸
     */
    fun onVideoSizeChange(
        width: Int,
        height: Int,
        unappliedRotationDegrees: Int,
        pixelWidthHeightRatio: Float,
        playerModel: Model?
    ) {

    }

    /**
     * 视频焦点回调
     * 需要先启用
     * 调用IYzsPlayer.setAudioForceEnable(true)
     */
    override fun onAudioFocusChange(focusChange: Int) {

    }

    /**
     * 当监听器被添加的时候 回调
     */
    fun onListenerAdd(playerModel: Model?, listener: SimplePlayerListener<Model>) {

    }

    /**
     * 当监听器移除的时候 回调
     */
    fun onListenerRemove(playerModel: Model?, listener: SimplePlayerListener<Model>) {

    }

    /**
     * 当播放器销毁监听
     */
    fun onPlayerDestroy(player: IYzsPlayer<Model>, playerModel: Model?) {

    }

    /**
     * 当播放速度发生变化
     */
    fun onSpeedChange(speed: Float) {

    }
}